home *** CD-ROM | disk | FTP | other *** search
/ EuroCD 3 / EuroCD 3.iso / Games / Doom / ADoom-0.8 / ADoom_src / c2p8_040_amlaukka.s < prev    next >
Text File  |  1998-06-24  |  9KB  |  553 lines

  1.         mc68020
  2.         multipass
  3.     if (_eval(DEBUG)&$8000)
  4.         debug    on,lattice4
  5.     endc
  6.  
  7. *
  8. *   c2p8_040_amlaukka.s - chunky to planar for bytes
  9. *   by Aki Laukkanen <amlaukka@cc.helsinki.fi>
  10. *
  11. *   This file is public domain.
  12. *
  13.  
  14. ;    include "graphics/gfx.i"
  15. ;    include "exec/types.i"
  16. ;    include "exec/memory.i"
  17. ;    include "lvo/exec_lib.i"
  18.  
  19.     XDEF    _c2p8
  20.     XDEF    @c2p8
  21.     XDEF    _c2p8_reloc
  22.     XDEF    @c2p8_reloc
  23.     XDEF    _c2p8_deinit
  24.     XDEF    @c2p8_deinit
  25.  
  26.     cnop    0,16
  27.  
  28. *
  29. * void __asm *c2p8_reloc(register __a0 void *chunky,
  30. *                        register __a1 struct BitMap *bitmap,
  31. *                        register __a6 struct ExecBase *SysBase);
  32. *
  33.  
  34. _c2p8_reloc
  35. @c2p8_reloc
  36.     movem.l a2/a3,-(sp)
  37.     move.l  a0,a2
  38.     move.l  a1,a3
  39.     move.l  #_c2p8_end-_c2p8,d0
  40.     move.l  #MEMF_FAST,d1
  41.     jsr     (_LVOAllocVec,a6)
  42.     tst.l   d0
  43.     beq     .fail
  44.     move.l  d0,a0                   ; FIXME: align by cache line
  45.                     ; size and make changes to
  46.                     ; the c2p too.
  47.     lea     _c2p8,a1
  48.     move.w  #_c2p8_end-_c2p8-1,d1
  49. .loop
  50.     move.b  (a1)+,(a0)+
  51.     dbf     d1,.loop
  52.  
  53.     move.l  d0,a0
  54.     move.l  (bm_Planes+4,a3),d1
  55.     sub.l   (bm_Planes,a3),d1
  56.     move.l  d1,(c2p8_p1_1-_c2p8-4,a0)
  57.     move.l  d1,(c2p8_p1_2-_c2p8-4,a0)
  58.     move.l  (bm_Planes+8,a3),d1
  59.     sub.l   (bm_Planes,a3),d1
  60.     move.l  d1,(c2p8_p2_1-_c2p8-4,a0)
  61.     move.l  d1,(c2p8_p2_2-_c2p8-4,a0)
  62.     move.l  (bm_Planes+12,a3),d1
  63.     sub.l   (bm_Planes,a3),d1
  64.     move.l  d1,(c2p8_p3_1-_c2p8-4,a0)
  65.     move.l  d1,(c2p8_p3_2-_c2p8-4,a0)
  66.     move.l  (bm_Planes+16,a3),d1
  67.     sub.l   (bm_Planes,a3),d1
  68.     move.l  d1,(c2p8_p4_1-_c2p8-4,a0)
  69.     move.l  d1,(c2p8_p4_2-_c2p8-4,a0)
  70.     move.l  (bm_Planes+20,a3),d1
  71.     sub.l   (bm_Planes,a3),d1
  72.     move.l  d1,(c2p8_p5_1-_c2p8-4,a0)
  73.     move.l  d1,(c2p8_p5_2-_c2p8-4,a0)
  74.     move.l  (bm_Planes+24,a3),d1
  75.     sub.l   (bm_Planes,a3),d1
  76.     move.l  d1,(c2p8_p6_1-_c2p8-4,a0)
  77.     move.l  d1,(c2p8_p6_2-_c2p8-4,a0)
  78.     move.l  (bm_Planes+28,a3),d1
  79.     sub.l   (bm_Planes,a3),d1
  80.     move.l  d1,(c2p8_p7_1-_c2p8-4,a0)
  81.     move.l  d1,(c2p8_p7_2-_c2p8-4,a0)
  82.  
  83.     move.l  d0,a2
  84.     jsr     (_LVOCacheClearU,a6)
  85.     move.l  a2,d0
  86.  
  87. .fail
  88.     movem.l (sp)+,a2/a3
  89.     rts
  90.  
  91.     cnop    0,16
  92.  
  93. *
  94. *   void __asm c2p8_deinit(register __a0 void *c2p,
  95. *                          register __a6 struct ExecBase *SysBase);
  96. *
  97.  
  98. _c2p8_deinit
  99. @c2p8_deinit
  100.     move.l  a0,a1
  101.     jsr     (_LVOFreeVec,a6)
  102.     rts
  103.  
  104. *
  105. *   void __asm c2p8(register __a0 const void *chunky,
  106. *                   register __a1 void *chip,
  107. *                   register __a2 const void *chunky_end);
  108. *
  109.  
  110. _c2p8
  111. @c2p8
  112.     movem.l d2-d7/a2-a6,-(sp)
  113.     move.l  a0,a6
  114.     move.l  a2,a3
  115.     move.l  a1,a2
  116. c2p8_start
  117. ; a6 - chunky
  118. ; a2 - bitplanes
  119. ; a3 - chunky end
  120.  
  121.     move.l  (a6)+,d0
  122.     move.l  (a6)+,d1
  123.     move.l  (a6)+,d2
  124.     move.l  (a6)+,d3
  125.     move.l  (a6)+,d4
  126.     move.l  (a6)+,d5
  127.     move.l  (a6)+,d6
  128.     move.l  (a6)+,a0
  129.  
  130. ; 16x4: (d0,d4),(d2,d6),(d1,d5)
  131. ; 2x4: (d0,d4),(d2,d6),(d1,d5)
  132. ; 16x4: (d3,d7)
  133. ; 2x4: (d3,d7)
  134. ; 8x2: (d0,d2),(d1,d3)
  135. ; 1x2: (d0,d2),(d1,d3)
  136. ; 4x1: (d0,d1)
  137. ; write d0
  138. ; 4x1: (d2,d3)
  139. ; 8x2: (d4,d6),(d5,d7)
  140. ; 1x2: (d4,d6),(d5,d7)
  141. ; 4x1: (d4,d5),(d6,d7)
  142.  
  143. ; 16x4: (d0,d4),(d1,d5),(d2,d6)
  144.     swap    d4
  145.     swap    d5
  146.     swap    d6
  147.     eor.w   d4,d0
  148.     eor.w   d5,d1
  149.     eor.w   d6,d2
  150.     eor.w   d0,d4
  151.     eor.w   d1,d5
  152.     eor.w   d2,d6
  153.     eor.w   d4,d0
  154.     eor.w   d5,d1
  155.     eor.w   d6,d2
  156.     swap    d4
  157.     swap    d5
  158.     swap    d6
  159.  
  160. ; 2x4: (d0,d4),(d1,d5),(d2,d6)
  161.     move.l  d4,d7
  162.     lsr.l   #2,d7
  163.     eor.l   d0,d7
  164.     and.l   #$33333333,d7
  165.     eor.l   d7,d0
  166.     lsl.l   #2,d7
  167.     eor.l   d7,d4
  168.  
  169.     move.l  d5,d7
  170.     lsr.l   #2,d7
  171.     eor.l   d1,d7
  172.     and.l   #$33333333,d7
  173.     eor.l   d7,d1
  174.     lsl.l   #2,d7
  175.     eor.l   d7,d5
  176.  
  177.     move.l  d6,d7
  178.     lsr.l   #2,d7
  179.     eor.l   d2,d7
  180.     and.l   #$33333333,d7
  181.     eor.l   d7,d2
  182.     lsl.l   #2,d7
  183.     eor.l   d7,d6
  184.  
  185.     exg     a0,d6           ; d7 -> d6
  186.                             ; d6 -> a2
  187.  
  188. ; 16x4: (d3,d7)
  189.  
  190.     swap    d6
  191.     eor.w   d6,d3
  192.     eor.w   d3,d6
  193.     eor.w   d6,d3
  194.     swap    d6
  195.  
  196. ; 2x4 (d3,d7)
  197.  
  198.     move.l  d6,d7
  199.     lsr.l   #2,d7
  200.     eor.l   d3,d7
  201.     and.l   #$33333333,d7
  202.     eor.l   d7,d3
  203.     lsl.l   #2,d7
  204.     eor.l   d7,d6
  205.  
  206. ; 8x2: (d0,d2),(d1,d3)
  207.  
  208.     move.l  d2,d7
  209.     lsr.l   #8,d7
  210.     eor.l   d0,d7
  211.     and.l   #$00ff00ff,d7
  212.     eor.l   d7,d0
  213.     lsl.l   #8,d7
  214.     eor.l   d7,d2
  215.  
  216.     move.l  d3,d7
  217.     lsr.l   #8,d7
  218.     eor.l   d1,d7
  219.     and.l   #$00ff00ff,d7
  220.     eor.l   d7,d1
  221.     lsl.l   #8,d7
  222.     eor.l   d7,d3
  223.  
  224. ; 1x2: (d0,d2),(d1,d3)
  225.  
  226.     move.l  d2,d7
  227.     lsr.l   #1,d7
  228.     eor.l   d0,d7
  229.     and.l   #$55555555,d7
  230.     eor.l   d7,d0
  231.     add.l   d7,d7
  232.     eor.l   d7,d2
  233.  
  234.     move.l  d3,d7
  235.     lsr.l   #1,d7
  236.     eor.l   d1,d7
  237.     and.l   #$55555555,d7
  238.     eor.l   d7,d1
  239.     add.l   d7,d7
  240.     eor.l   d7,d3
  241.  
  242. ; 4x1: (d0,d1)
  243.  
  244.     move.l  d1,d7
  245.     lsr.l   #4,d7
  246.     eor.l   d0,d7
  247.     and.l   #$0f0f0f0f,d7
  248.     eor.l   d7,d0
  249.     move.l  d0,($12341234,a2)
  250. c2p8_p7_1
  251.     lsl.l   #4,d7
  252.     eor.l   d7,d1
  253.  
  254. ; 4x1: (d2,d3)
  255.  
  256.     move.l  d3,d7
  257.     lsr.l   #4,d7
  258.     eor.l   d2,d7
  259.     and.l   #$0f0f0f0f,d7
  260.     eor.l   d7,d2
  261.     lsl.l   #4,d7
  262.     eor.l   d7,d3
  263.  
  264.     move.l  a0,d0               ; d6 -> d0
  265.  
  266. ; 8x2: (d4,d6),(d5,d7)
  267.  
  268.     move.l  d0,d7
  269.     lsr.l   #8,d7
  270.     eor.l   d4,d7
  271.     and.l   #$00ff00ff,d7
  272.     move.l  d1,($12341234,a2)
  273. c2p8_p3_1
  274.     eor.l   d7,d4
  275.     lsl.l   #8,d7
  276.     eor.l   d7,d0
  277.  
  278.     move.l  d6,d7
  279.     lsr.l   #8,d7
  280.     eor.l   d5,d7
  281.     and.l   #$00ff00ff,d7
  282.     eor.l   d7,d5
  283.     lsl.l   #8,d7
  284.     eor.l   d7,d6
  285.  
  286. ; 1x2: (d4,d6),(d5,d7)
  287.  
  288.     move.l  d0,d7
  289.     lsr.l   #1,d7
  290.     eor.l   d4,d7
  291.     and.l   #$55555555,d7
  292.     move.l  d2,($12341234,a2)
  293. c2p8_p6_1
  294.     eor.l   d7,d4
  295.     add.l   d7,d7
  296.     eor.l   d7,d0
  297.  
  298.     move.l  d6,d7
  299.     lsr.l   #1,d7
  300.     eor.l   d5,d7
  301.     and.l   #$55555555,d7
  302.     eor.l   d7,d5
  303.  
  304.     add.l   d7,d7
  305.     eor.l   d7,d6
  306.  
  307. ; 4x1: (d4,d5),(d6,d7)
  308.  
  309.     move.l  d5,d7
  310.     lsr.l   #4,d7
  311.     eor.l   d4,d7
  312.     and.l   #$0f0f0f0f,d7
  313.     move.l  d3,($12341234,a2)
  314. c2p8_p2_1
  315.     eor.l   d7,d4
  316.     lsl.l   #4,d7
  317.     eor.l   d7,d5
  318.  
  319.     move.l  d6,d7
  320.     lsr.l   #4,d7
  321.     eor.l   d0,d7
  322.     and.l   #$0f0f0f0f,d7
  323.     eor.l   d7,d0
  324.     lsl.l   #4,d7
  325.     eor.l   d7,d6
  326.  
  327.     move.l  d4,d7
  328.     move.l  d5,a4
  329.     move.l  d0,a5
  330.     move.l  d6,a1
  331.  
  332.     cmp.l   a3,a6
  333.     beq     c2p8_end
  334. c2p8_x1
  335.     move.l  (a6)+,d0
  336.     move.l  (a6)+,d1
  337.     move.l  (a6)+,d2
  338.     move.l  (a6)+,d3
  339.     move.l  (a6)+,d4
  340.     move.l  (a6)+,d5
  341.     move.l  (a6)+,d6
  342.     move.l  (a6)+,a0
  343.  
  344.     move.l  d7,($12341234,a2)
  345. c2p8_p5_1
  346.  
  347. ; 16x4: (d0,d4),(d1,d5),(d2,d6)
  348.     swap    d4
  349.     swap    d5
  350.     swap    d6
  351.     eor.w   d4,d0
  352.     eor.w   d5,d1
  353.     eor.w   d6,d2
  354.     eor.w   d0,d4
  355.     eor.w   d1,d5
  356.     eor.w   d2,d6
  357.     eor.w   d4,d0
  358.     eor.w   d5,d1
  359.     eor.w   d6,d2
  360.     swap    d4
  361.     swap    d5
  362.     swap    d6
  363. ; 2x4: (d0,d4),(d1,d5),(d2,d6)
  364.     move.l  d4,d7
  365.     lsr.l   #2,d7
  366.     eor.l   d0,d7
  367.     move.l  a4,($12341234,a2)
  368. c2p8_p1_1
  369.     and.l   #$33333333,d7
  370.     eor.l   d7,d0
  371.     lsl.l   #2,d7
  372.     eor.l   d7,d4
  373.  
  374.     move.l  d5,d7
  375.     lsr.l   #2,d7
  376.     eor.l   d1,d7
  377.     and.l   #$33333333,d7
  378.     eor.l   d7,d1
  379.     lsl.l   #2,d7
  380.     eor.l   d7,d5
  381.  
  382.     move.l  d6,d7
  383.     lsr.l   #2,d7
  384.     eor.l   d2,d7
  385.     and.l   #$33333333,d7
  386.     eor.l   d7,d2
  387.     lsl.l   #2,d7
  388.     eor.l   d7,d6
  389.     exg     a0,d6           ; d7 -> d6
  390.                             ; d6 -> a2
  391. ; 16x4: (d3,d7)
  392.  
  393.     swap    d6
  394.     move.l  a5,($12341234,a2)
  395. c2p8_p4_1
  396.     eor.w   d6,d3
  397.     eor.w   d3,d6
  398.     eor.w   d6,d3
  399.     swap    d6
  400.  
  401. ; 2x4 (d3,d7)
  402.  
  403.     move.l  d6,d7
  404.     lsr.l   #2,d7
  405.     eor.l   d3,d7
  406.     and.l   #$33333333,d7
  407.     eor.l   d7,d3
  408.     lsl.l   #2,d7
  409.     eor.l   d7,d6
  410.  
  411. ; 8x2: (d0,d2),(d1,d3)
  412.  
  413.     move.l  d2,d7
  414.     lsr.l   #8,d7
  415.     eor.l   d0,d7
  416.     and.l   #$00ff00ff,d7
  417.     eor.l   d7,d0
  418.     lsl.l   #8,d7
  419.     eor.l   d7,d2
  420.  
  421.     move.l  d3,d7
  422.     lsr.l   #8,d7
  423.     eor.l   d1,d7
  424.     and.l   #$00ff00ff,d7
  425.     move.l  a1,(a2)+
  426.     eor.l   d7,d1
  427.     lsl.l   #8,d7
  428.     eor.l   d7,d3
  429.  
  430. ; 1x2: (d0,d2),(d1,d3)
  431.  
  432.     move.l  d2,d7
  433.     lsr.l   #1,d7
  434.     eor.l   d0,d7
  435.     and.l   #$55555555,d7
  436.     eor.l   d7,d0
  437.     add.l   d7,d7
  438.     eor.l   d7,d2
  439.  
  440.     move.l  d3,d7
  441.     lsr.l   #1,d7
  442.     eor.l   d1,d7
  443.     and.l   #$55555555,d7
  444.     eor.l   d7,d1
  445.     add.l   d7,d7
  446.     eor.l   d7,d3
  447.  
  448. ; 4x1: (d0,d1)
  449.  
  450.     move.l  d1,d7
  451.     lsr.l   #4,d7
  452.     eor.l   d0,d7
  453.     and.l   #$0f0f0f0f,d7
  454.     eor.l   d7,d0
  455.     move.l  d0,($12341234,a2)
  456. c2p8_p7_2
  457.     lsl.l   #4,d7
  458.     eor.l   d7,d1
  459.  
  460. ; 4x1: (d2,d3)
  461.  
  462.     move.l  d3,d7
  463.     lsr.l   #4,d7
  464.     eor.l   d2,d7
  465.     and.l   #$0f0f0f0f,d7
  466.     eor.l   d7,d2
  467.     lsl.l   #4,d7
  468.     eor.l   d7,d3
  469.  
  470.     move.l  a0,d0               ; d6 -> d0
  471.  
  472. ; 8x2: (d4,d6),(d5,d7)
  473.  
  474.     move.l  d0,d7
  475.     lsr.l   #8,d7
  476.     eor.l   d4,d7
  477.     and.l   #$00ff00ff,d7
  478.     move.l  d1,($12341234,a2)
  479. c2p8_p3_2
  480.     eor.l   d7,d4
  481.     lsl.l   #8,d7
  482.     eor.l   d7,d0
  483.  
  484.     move.l  d6,d7
  485.     lsr.l   #8,d7
  486.     eor.l   d5,d7
  487.     and.l   #$00ff00ff,d7
  488.     eor.l   d7,d5
  489.     lsl.l   #8,d7
  490.     eor.l   d7,d6
  491.  
  492. ; 1x2: (d4,d6),(d5,d7)
  493.  
  494.     move.l  d0,d7
  495.     lsr.l   #1,d7
  496.     eor.l   d4,d7
  497.     and.l   #$55555555,d7
  498.     move.l  d2,($12341234,a2)
  499. c2p8_p6_2
  500.     eor.l   d7,d4
  501.     add.l   d7,d7
  502.     eor.l   d7,d0
  503.  
  504.     move.l  d6,d7
  505.     lsr.l   #1,d7
  506.     eor.l   d5,d7
  507.     and.l   #$55555555,d7
  508.     eor.l   d7,d5
  509.     add.l   d7,d7
  510.     eor.l   d7,d6
  511.  
  512. ; 4x1: (d4,d5),(d6,d7)
  513.  
  514.     move.l  d5,d7
  515.     lsr.l   #4,d7
  516.     eor.l   d4,d7
  517.     and.l   #$0f0f0f0f,d7
  518.     move.l  d3,($12341234,a2)
  519. c2p8_p2_2
  520.     eor.l   d7,d4
  521.     lsl.l   #4,d7
  522.     eor.l   d7,d5
  523.  
  524.     move.l  d6,d7
  525.     lsr.l   #4,d7
  526.     eor.l   d0,d7
  527.     and.l   #$0f0f0f0f,d7
  528.     eor.l   d7,d0
  529.     lsl.l   #4,d7
  530.     eor.l   d7,d6
  531.  
  532.     move.l  d4,d7
  533.     move.l  d5,a4
  534.     move.l  d0,a5
  535.     move.l  d6,a1
  536.  
  537.     cmp.l   a3,a6
  538.     bne     c2p8_x1
  539. c2p8_end
  540.     move.l  d7,($12341234,a2)
  541. c2p8_p5_2
  542.     move.l  a4,($12341234,a2)
  543. c2p8_p1_2
  544.     move.l  a5,($12341234,a2)
  545. c2p8_p4_2
  546.     move.l  a1,(a2)
  547.  
  548.     movem.l (sp)+,d2-d7/a2-a6
  549.     rts
  550. _c2p8_end
  551.  
  552.     end
  553.